/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * LancarAtividades.java
 **
 * Created on 15/01/2013, 08:38:28
 */

package distribuicaoDeProfessores;

import java.util.ArrayList;
import java.util.Collections;

/**
 *
 * @author Jaime
 */
public class LancarAtividades extends javax.swing.JPanel {
    AtividadesCadastradas atividadesCadastradas;
    String[] nomes;//usado para escrever a lista de seleção de atividade
    ProfessorAfinidadeAtividade professorAfinidadeAtividade;
    ProfessoresComDisciplinas professores;
    RelatorioDeDistribuicao relatorio;
    BayesianNetwork bn;
    /** Creates new form LancarAtividades */
    public LancarAtividades(RelatorioDeDistribuicao relatorio, BayesianNetwork bn, AtividadesCadastradas atividadesCadastradas, ProfessorAfinidadeAtividade professorAfinidadeAtividade, 
            ProfessoresComDisciplinas professores) 
    {
        this.atividadesCadastradas = atividadesCadastradas;
        this.professorAfinidadeAtividade = professorAfinidadeAtividade;
        this.professores = professores;
        this.bn = bn;
        this.relatorio = relatorio;
        
        initComponents();
    }

    public void configuraListaDeNomes(){
        nomes = new String[atividadesCadastradas.getAtividades().size()];
        for(int i = 0; i < atividadesCadastradas.getAtividades().size(); i++){
            nomes[i]= i + " - " + atividadesCadastradas.getAtividades().get(i).getNome() + " - " +
                     atividadesCadastradas.getAtividades().get(i).getCh() +"hs" + " - "+ 
                     atividadesCadastradas.getAtividades().get(i).getPont()+" pontos";
        }
        jList1.setListData(nomes);
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane2 = new javax.swing.JScrollPane();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        setBackground(new java.awt.Color(255, 233, 233));
        setLayout(new java.awt.BorderLayout());

        jPanel1.setBackground(new java.awt.Color(242, 229, 238));

        jList1.setBackground(new java.awt.Color(255, 255, 204));
        jList1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.LOWERED, new java.awt.Color(255, 255, 0), new java.awt.Color(255, 51, 0), new java.awt.Color(255, 0, 0), new java.awt.Color(255, 255, 0)));
        jList1.setFont(new java.awt.Font("Tahoma", 0, 16));
        jList1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        jList1.setToolTipText("");
        jList1.setVerifyInputWhenFocusTarget(false);
        jList1.setVisibleRowCount(20);
        jScrollPane1.setViewportView(jList1);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18));
        jLabel1.setText("Selecione o tipo atividade desejada: ");

        jButton1.setBackground(new java.awt.Color(119, 3, 119));
        jButton1.setFont(new java.awt.Font("Tahoma", 1, 14));
        jButton1.setForeground(new java.awt.Color(255, 255, 255));
        jButton1.setText("Definir um Professor");
        jButton1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel2.setFont(new java.awt.Font("Segoe Script", 0, 36));
        jLabel2.setText("Lançar uma nova ativiade");

        jTextArea1.setBackground(new java.awt.Color(239, 223, 234));
        jTextArea1.setColumns(20);
        jTextArea1.setEditable(false);
        jTextArea1.setFont(new java.awt.Font("Monospaced", 1, 13)); // NOI18N
        jTextArea1.setRows(5);
        jTextArea1.setText("  Antes de lançar uma atividade\ndeve-se fazer a distribuição de\ndisciplinas para os professores.\nIsso pode ser feito no menu \nEditar/distribuir disciplinas.\n\n");
        jTextArea1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.LOWERED, new java.awt.Color(242, 229, 238), new java.awt.Color(239, 212, 231), new java.awt.Color(228, 196, 218), new java.awt.Color(242, 229, 238)));
        jTextArea1.setFocusable(false);
        jScrollPane3.setViewportView(jTextArea1);

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jLabel2)
                .addContainerGap(113, Short.MAX_VALUE))
            .add(jPanel1Layout.createSequentialGroup()
                .add(14, 14, 14)
                .add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 285, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(18, 18, 18)
                .add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 187, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(139, Short.MAX_VALUE))
            .add(jPanel1Layout.createSequentialGroup()
                .add(80, 80, 80)
                .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 366, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(197, Short.MAX_VALUE))
            .add(jPanel1Layout.createSequentialGroup()
                .add(68, 68, 68)
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE)
                .add(214, 214, 214))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jLabel2)
                .add(18, 18, 18)
                .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 27, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(14, 14, 14)
                        .add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 136, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(35, 35, 35)
                        .add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 36, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        jScrollPane2.setViewportView(jPanel1);

        add(jScrollPane2, java.awt.BorderLayout.CENTER);
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        //Esté método calcula as crenças e escolhe um professor ara assumir a atividade
        float temp=0.0f;
        double crenca=0.0;
        try{
        relatorio.areaTexto.append("Relatorio de escolha de atividade\n\n\tAtividade: "+
                atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()) + "\n\n");
        ProfessorPorAtividade professorPorAtividade = new ProfessorPorAtividade(atividadesCadastradas.atividades.get(jList1.getSelectedIndex()), new ArrayList<ProfessorProbabilidade>());
        String cargaHorariaDisponivel="", afinidadeAtividade="", cargaHorariaAlocada="", pontuacaoProfessor="";
        //Primeiramente se deve inferir dados referentes aos 4 nós para o calculo das crenças
        //para cada professor
        for(int i = 0; i < professores.getProfessoresComDisciplinas().size(); i++){
            
            //Verifica dado para nó Carga Horaria Disponivel
            temp = professores.getProfessoresComDisciplinas().get(i).getChA() + professores.getProfessoresComDisciplinas().get(i).getChD();
            if(temp <= 40-atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()).getPont()) 
                            cargaHorariaDisponivel="sim";
            else cargaHorariaDisponivel="nao";
            
            //Verifica o dado para o nó que infere intervalo da carga horaria já alocada 
            if(temp <= 20) cargaHorariaAlocada="intervalo1";
            else if (temp <= 29) cargaHorariaAlocada="intervalo2";
            else if (temp <= 35 ) cargaHorariaAlocada="intervalo3";
            else cargaHorariaAlocada="intervalo4";
            
            //Verifica a porecentagem de pontuação em relação aos outros professores
            //Aplicando uma regra de 3 para definir o valor relativo a média em porcentagem
            temp = (professores.getProfessoresComDisciplinas().get(i).getPontos() * 100.0f)/ professores.PontuacaoMedia();
                    if (temp < 80) pontuacaoProfessor = "pontuacaoBaixa";
                    else if (temp <= 120) pontuacaoProfessor = "pontuacaoMedia";
                    else pontuacaoProfessor = "pontuacaoAlta";
                    
            //Verificando o dado para o nó de preferenica/afinidade do professor com relação a atividade
            
            temp = (float)professorAfinidadeAtividade.getProfessores().get(professorAfinidadeAtividade.encontrarIndice(professores.getProfessoresComDisciplinas().get(i).getProfessor())).getAfinidade(jList1.getSelectedIndex());
            if(temp == 1)afinidadeAtividade="afinidadeBaixa";
            else if(temp == 2) afinidadeAtividade="afinidadeMedia";
            else afinidadeAtividade="afinidadeAlta";
            //javax.swing.JOptionPane.showMessageDialog(null, atividade);
            //Inferindo a creça de um professor pegar a atividade
            crenca = bn.inferirProbabilidadeAtividade(cargaHorariaDisponivel, afinidadeAtividade, pontuacaoProfessor, cargaHorariaAlocada);
            professorPorAtividade.adicionarProfessor(new ProfessorProbabilidade(professores.getProfessoresComDisciplinas().get(i).getProfessor(), crenca));
            relatorio.areaTexto.append(i+1+" - " +
                    professores.getProfessoresComDisciplinas().get(i).getProfessor().getNome() +
                    "  -> "+cargaHorariaDisponivel+" tem CH. Disponível" +
                    ". A afinidade é: "+ afinidadeAtividade+
                    ".\nÉ classificado como: " + pontuacaoProfessor +" e C.H. no " + cargaHorariaAlocada+
                    ".\n Crença:  " + crenca + "\n\n");
        }
        //Verificando a maior crença, embaralhando para escolher ao acaso no caso de empates
        //Tambem e verificado se o professor não ultrapassou a carga horaria para um determinada aividade
        
        
        Collections.shuffle(professorPorAtividade.getProfessores()); // Para gerar, ir revezando os professores para a disciplina eu embaralho a lista dos professores.
			Professor professorMaiorProbabilidade = null;
			double maiorProbabilidade = 0;
			for(int iCount = 0; iCount < professorPorAtividade.getProfessores().size(); iCount++) {
				if(professorPorAtividade.getProfessores().get(iCount).getProbabilidadePegarDisciplina() > maiorProbabilidade && 
                                        professores.getProfessoresComDisciplinas().get(iCount).totalPontoMesmaAtividade(atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()))<atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()).getPontMax()) {
					maiorProbabilidade = professorPorAtividade.getProfessores().get(iCount).getProbabilidadePegarDisciplina(); 
					professorMaiorProbabilidade = professorPorAtividade.getProfessores().get(iCount).getProfessores();
				}
			}
                    
                     //Alocando a atividade para o professor escolhido
                     professores.getProfessoresComDisciplinas().get(professores.encontrarProfessor(professorMaiorProbabilidade)).addAtividadesPegas(atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()));           
                     javax.swing.JOptionPane.showMessageDialog(null, "O(A) professor(a) escolhido(a) para a atividade  " + 
                             atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()).getNome() + 
                             " foi o(a) " + professores.getProfessoresComDisciplinas().get(professores.encontrarProfessor(professorMaiorProbabilidade)).getProfessor().getNome());
	//Imprimindo no relatorio		
        relatorio.areaTexto.append("O(A) professor(a) escolhido(a) para a atividade  " + 
                             atividadesCadastradas.getAtividades().get(jList1.getSelectedIndex()).getNome() + 
                             " foi o(a) " + professores.getProfessoresComDisciplinas().get(professores.encontrarProfessor(professorMaiorProbabilidade)).getProfessor().getNome()+".");
        }catch(ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException){
            javax.swing.JOptionPane.showMessageDialog(null, "Faça a distribuição das disciplinas primeiro.\nSe for necessario cadastre as disciplinas, professores e o horário.", "Erro!!!", javax.swing.JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_jButton1ActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JList jList1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration//GEN-END:variables

}
